<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/bitops.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/bitops.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0JJVE9QU19IXzA_"><span class="b">_LINUX_BITOPS_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0JJVE9QU19IXzA_"><span class="b">_LINUX_BITOPS_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="4" /><span class="Maybe">       4:</span> 
<a name="5" /><span class="Maybe">       5:</span> <span class="f">#</span><span class="n">ifdef</span>    <a href="cpu.c_macros_ref.html#_X19LRVJORUxfX18w"><span class="b">__KERNEL__</span></a>
<a name="6" /><span class="Maybe">       6:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QklUXzA_"><span class="b">BIT</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span>            <span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="b">nr</span><span class="f">)</span><span class="f">)</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QklUX1VMTF8w"><span class="b">BIT_ULL</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span>        <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="b">nr</span><span class="f">)</span><span class="f">)</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QklUX01BU0tfMA__"><span class="b">BIT_MASK</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span>        <span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="f">(</span><span class="b">nr</span><span class="f">)</span> <span class="f">%</span> <a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a><span class="f">)</span><span class="f">)</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QklUX1dPUkRfMA__"><span class="b">BIT_WORD</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span>        <span class="f">(</span><span class="f">(</span><span class="b">nr</span><span class="f">)</span> <span class="f">/</span> <a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a><span class="f">)</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QklUX1VMTF9NQVNLXzA_"><span class="b">BIT_ULL_MASK</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span>    <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="f">(</span><span class="b">nr</span><span class="f">)</span> <span class="f">%</span> <a href="cpu.c_macros_noref.html#_QklUU19QRVJfTE9OR19MT05HXzA_"><span class="b">BITS_PER_LONG_LONG</span></a><span class="f">)</span><span class="f">)</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QklUX1VMTF9XT1JEXzA_"><span class="b">BIT_ULL_WORD</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="b">nr</span><span class="f">)</span> <span class="f">/</span> <a href="cpu.c_macros_noref.html#_QklUU19QRVJfTE9OR19MT05HXzA_"><span class="b">BITS_PER_LONG_LONG</span></a><span class="f">)</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QklUU19QRVJfQllURV8w"><span class="b">BITS_PER_BYTE</span></a>        <span class="c">8</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QklUU19UT19MT05HU18w"><span class="b">BITS_TO_LONGS</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_RElWX1JPVU5EX1VQXzA_"><span class="b">DIV_ROUND_UP</span></a><span class="f">(</span><span class="b">nr</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_QklUU19QRVJfQllURV8w"><span class="b">BITS_PER_BYTE</span></a> <span class="f">*</span> <span class="m">sizeof</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">)</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="f">#</span><span class="n">endif</span>
<a name="15" /><span class="Maybe">      15:</span> 
<a name="16" /><span class="Maybe">      16:</span> <span class="k">/*</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="k"> * Create a contiguous bitmask starting at bit position @l and ending at</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="k"> * position @h. For example</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="k"> * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="k"> */</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_R0VOTUFTS18w"><span class="b">GENMASK</span></a><span class="f">(</span><span class="b">h</span><span class="f">,</span> <span class="b">l</span><span class="f">)</span>        <span class="f">(</span><span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_VTMyX0NfMA__"><span class="b">U32_C</span></a><span class="f">(</span><span class="c">1</span><span class="f">)</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="f">(</span><span class="b">h</span><span class="f">)</span> <span class="f">-</span> <span class="f">(</span><span class="b">l</span><span class="f">)</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="b">l</span><span class="f">)</span><span class="f">)</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_R0VOTUFTS19VTExfMA__"><span class="b">GENMASK_ULL</span></a><span class="f">(</span><span class="b">h</span><span class="f">,</span> <span class="b">l</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_VTY0X0NfMA__"><span class="b">U64_C</span></a><span class="f">(</span><span class="c">1</span><span class="f">)</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="f">(</span><span class="b">h</span><span class="f">)</span> <span class="f">-</span> <span class="f">(</span><span class="b">l</span><span class="f">)</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="b">l</span><span class="f">)</span><span class="f">)</span>
<a name="23" /><span class="Maybe">      23:</span> 
<a name="24" /><span class="Maybe">      24:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">__sw_hweight8</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">w</span><span class="f">)</span><span class="f">;</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">__sw_hweight16</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">w</span><span class="f">)</span><span class="f">;</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">__sw_hweight32</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">w</span><span class="f">)</span><span class="f">;</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">__sw_hweight64</span><span class="f">(</span><span class="b">__u64</span> <span class="b">w</span><span class="f">)</span><span class="f">;</span>
<a name="28" /><span class="Maybe">      28:</span> 
<a name="29" /><span class="Maybe">      29:</span> <span class="k">/*</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k"> * Include this here because some architectures need generic_ffs/fls in</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> * scope</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> */</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">bitops</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="34" /><span class="Maybe">      34:</span> 
<a name="35" /><span class="Maybe">      35:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfc2V0X2JpdF8w"><span class="b">for_each_set_bit</span></a><span class="f">(</span><span class="b">bit</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span> \
<a name="36" /><span class="Maybe">      36:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">=</span> <span class="b">find_first_bit</span><span class="f">(</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>        \
<a name="37" /><span class="Maybe">      37:</span>          <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">&lt;</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">;</span>                    \
<a name="38" /><span class="Maybe">      38:</span>          <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">=</span> <span class="b">find_next_bit</span><span class="f">(</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="39" /><span class="Maybe">      39:</span> 
<a name="40" /><span class="Maybe">      40:</span> <span class="k">/* same as for_each_set_bit() but use bit as value to start with */</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfc2V0X2JpdF9mcm9tXzA_"><span class="b">for_each_set_bit_from</span></a><span class="f">(</span><span class="b">bit</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span> \
<a name="42" /><span class="Maybe">      42:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">=</span> <span class="b">find_next_bit</span><span class="f">(</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">bit</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>    \
<a name="43" /><span class="Maybe">      43:</span>          <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">&lt;</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">;</span>                    \
<a name="44" /><span class="Maybe">      44:</span>          <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">=</span> <span class="b">find_next_bit</span><span class="f">(</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="45" /><span class="Maybe">      45:</span> 
<a name="46" /><span class="Maybe">      46:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfY2xlYXJfYml0XzA_"><span class="b">for_each_clear_bit</span></a><span class="f">(</span><span class="b">bit</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span> \
<a name="47" /><span class="Maybe">      47:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">=</span> <span class="b">find_first_zero_bit</span><span class="f">(</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>    \
<a name="48" /><span class="Maybe">      48:</span>          <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">&lt;</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">;</span>                    \
<a name="49" /><span class="Maybe">      49:</span>          <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">=</span> <span class="b">find_next_zero_bit</span><span class="f">(</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="50" /><span class="Maybe">      50:</span> 
<a name="51" /><span class="Maybe">      51:</span> <span class="k">/* same as for_each_clear_bit() but use bit as value to start with */</span>
<a name="52" /><span class="Maybe">      52:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfY2xlYXJfYml0X2Zyb21fMA__"><span class="b">for_each_clear_bit_from</span></a><span class="f">(</span><span class="b">bit</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span> \
<a name="53" /><span class="Maybe">      53:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">=</span> <span class="b">find_next_zero_bit</span><span class="f">(</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">bit</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>    \
<a name="54" /><span class="Maybe">      54:</span>          <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">&lt;</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">;</span>                    \
<a name="55" /><span class="Maybe">      55:</span>          <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">=</span> <span class="b">find_next_zero_bit</span><span class="f">(</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">bit</span><span class="f">)</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="56" /><span class="Maybe">      56:</span> 
<a name="57" /><span class="Maybe">      57:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19pbmxpbmVfX18w"><span class="b">__inline__</span></a> <span class="m">int</span> <span class="b">get_bitmask_order</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">count</span><span class="f">)</span>
<a name="58" /><span class="Maybe">      58:</span> <span class="f">{</span>
<a name="59" /><span class="Maybe">      59:</span>     <span class="m">int</span> <span class="b">order</span><span class="f">;</span>
<a name="60" /><span class="Maybe">      60:</span> 
<a name="61" /><span class="Maybe">      61:</span>     <span class="b">order</span> <span class="f">=</span> <span class="b">fls</span><span class="f">(</span><span class="b">count</span><span class="f">)</span><span class="f">;</span>
<a name="62" /><span class="Maybe">      62:</span>     <span class="m">return</span> <span class="b">order</span><span class="f">;</span>    <span class="k">/* We could be slightly more clever with -1 here... */</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="f">}</span>
<a name="64" /><span class="Maybe">      64:</span> 
<a name="65" /><span class="Maybe">      65:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19pbmxpbmVfX18w"><span class="b">__inline__</span></a> <span class="m">int</span> <span class="b">get_count_order</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">count</span><span class="f">)</span>
<a name="66" /><span class="Maybe">      66:</span> <span class="f">{</span>
<a name="67" /><span class="Maybe">      67:</span>     <span class="m">int</span> <span class="b">order</span><span class="f">;</span>
<a name="68" /><span class="Maybe">      68:</span> 
<a name="69" /><span class="Maybe">      69:</span>     <span class="b">order</span> <span class="f">=</span> <span class="b">fls</span><span class="f">(</span><span class="b">count</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">;</span>
<a name="70" /><span class="Maybe">      70:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">count</span> <span class="f">&amp;</span> <span class="f">(</span><span class="b">count</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="71" /><span class="Maybe">      71:</span>         <span class="b">order</span><span class="f">++</span><span class="f">;</span>
<a name="72" /><span class="Maybe">      72:</span>     <span class="m">return</span> <span class="b">order</span><span class="f">;</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="f">}</span>
<a name="74" /><span class="Maybe">      74:</span> 
<a name="75" /><span class="Maybe">      75:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">hweight_long</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">w</span><span class="f">)</span>
<a name="76" /><span class="Maybe">      76:</span> <span class="f">{</span>
<a name="77" /><span class="Maybe">      77:</span>     <span class="m">return</span> <span class="m">sizeof</span><span class="f">(</span><span class="b">w</span><span class="f">)</span> <span class="f">==</span> <span class="c">4</span> <span class="f">?</span> <a href="cpu.c_macros_ref.html#_aHdlaWdodDMyXzA_"><span class="b">hweight32</span></a><span class="f">(</span><span class="b">w</span><span class="f">)</span> <span class="f">:</span> <a href="cpu.c_macros_ref.html#_aHdlaWdodDY0XzA_"><span class="b">hweight64</span></a><span class="f">(</span><span class="b">w</span><span class="f">)</span><span class="f">;</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="f">}</span>
<a name="79" /><span class="Maybe">      79:</span> 
<a name="80" /><span class="Maybe">      80:</span> <span class="k">/**</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="k"> * rol64 - rotate a 64-bit value left</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="k"> * @word: value to rotate</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="k"> * @shift: bits to roll</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="k"> */</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__u64</span> <span class="b">rol64</span><span class="f">(</span><span class="b">__u64</span> <span class="b">word</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span>
<a name="86" /><span class="Maybe">      86:</span> <span class="f">{</span>
<a name="87" /><span class="Maybe">      87:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">word</span> <span class="f">&lt;&lt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">|</span> <span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="f">(</span><span class="c">64</span> <span class="f">-</span> <span class="b">shift</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="88" /><span class="Maybe">      88:</span> <span class="f">}</span>
<a name="89" /><span class="Maybe">      89:</span> 
<a name="90" /><span class="Maybe">      90:</span> <span class="k">/**</span>
<a name="91" /><span class="Maybe">      91:</span> <span class="k"> * ror64 - rotate a 64-bit value right</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="k"> * @word: value to rotate</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="k"> * @shift: bits to roll</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="k"> */</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__u64</span> <span class="b">ror64</span><span class="f">(</span><span class="b">__u64</span> <span class="b">word</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span>
<a name="96" /><span class="Maybe">      96:</span> <span class="f">{</span>
<a name="97" /><span class="Maybe">      97:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">|</span> <span class="f">(</span><span class="b">word</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="c">64</span> <span class="f">-</span> <span class="b">shift</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="98" /><span class="Maybe">      98:</span> <span class="f">}</span>
<a name="99" /><span class="Maybe">      99:</span> 
<a name="100" /><span class="Maybe">     100:</span> <span class="k">/**</span>
<a name="101" /><span class="Maybe">     101:</span> <span class="k"> * rol32 - rotate a 32-bit value left</span>
<a name="102" /><span class="Maybe">     102:</span> <span class="k"> * @word: value to rotate</span>
<a name="103" /><span class="Maybe">     103:</span> <span class="k"> * @shift: bits to roll</span>
<a name="104" /><span class="Maybe">     104:</span> <span class="k"> */</span>
<a name="105" /><span class="Maybe">     105:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__u32</span> <span class="b">rol32</span><span class="f">(</span><span class="b">__u32</span> <span class="b">word</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span>
<a name="106" /><span class="Maybe">     106:</span> <span class="f">{</span>
<a name="107" /><span class="Maybe">     107:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">word</span> <span class="f">&lt;&lt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">|</span> <span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="f">(</span><span class="c">32</span> <span class="f">-</span> <span class="b">shift</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="108" /><span class="Maybe">     108:</span> <span class="f">}</span>
<a name="109" /><span class="Maybe">     109:</span> 
<a name="110" /><span class="Maybe">     110:</span> <span class="k">/**</span>
<a name="111" /><span class="Maybe">     111:</span> <span class="k"> * ror32 - rotate a 32-bit value right</span>
<a name="112" /><span class="Maybe">     112:</span> <span class="k"> * @word: value to rotate</span>
<a name="113" /><span class="Maybe">     113:</span> <span class="k"> * @shift: bits to roll</span>
<a name="114" /><span class="Maybe">     114:</span> <span class="k"> */</span>
<a name="115" /><span class="Maybe">     115:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__u32</span> <span class="b">ror32</span><span class="f">(</span><span class="b">__u32</span> <span class="b">word</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span>
<a name="116" /><span class="Maybe">     116:</span> <span class="f">{</span>
<a name="117" /><span class="Maybe">     117:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">|</span> <span class="f">(</span><span class="b">word</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="c">32</span> <span class="f">-</span> <span class="b">shift</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="118" /><span class="Maybe">     118:</span> <span class="f">}</span>
<a name="119" /><span class="Maybe">     119:</span> 
<a name="120" /><span class="Maybe">     120:</span> <span class="k">/**</span>
<a name="121" /><span class="Maybe">     121:</span> <span class="k"> * rol16 - rotate a 16-bit value left</span>
<a name="122" /><span class="Maybe">     122:</span> <span class="k"> * @word: value to rotate</span>
<a name="123" /><span class="Maybe">     123:</span> <span class="k"> * @shift: bits to roll</span>
<a name="124" /><span class="Maybe">     124:</span> <span class="k"> */</span>
<a name="125" /><span class="Maybe">     125:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__u16</span> <span class="b">rol16</span><span class="f">(</span><span class="b">__u16</span> <span class="b">word</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span>
<a name="126" /><span class="Maybe">     126:</span> <span class="f">{</span>
<a name="127" /><span class="Maybe">     127:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">word</span> <span class="f">&lt;&lt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">|</span> <span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="f">(</span><span class="c">16</span> <span class="f">-</span> <span class="b">shift</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="128" /><span class="Maybe">     128:</span> <span class="f">}</span>
<a name="129" /><span class="Maybe">     129:</span> 
<a name="130" /><span class="Maybe">     130:</span> <span class="k">/**</span>
<a name="131" /><span class="Maybe">     131:</span> <span class="k"> * ror16 - rotate a 16-bit value right</span>
<a name="132" /><span class="Maybe">     132:</span> <span class="k"> * @word: value to rotate</span>
<a name="133" /><span class="Maybe">     133:</span> <span class="k"> * @shift: bits to roll</span>
<a name="134" /><span class="Maybe">     134:</span> <span class="k"> */</span>
<a name="135" /><span class="Maybe">     135:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__u16</span> <span class="b">ror16</span><span class="f">(</span><span class="b">__u16</span> <span class="b">word</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span>
<a name="136" /><span class="Maybe">     136:</span> <span class="f">{</span>
<a name="137" /><span class="Maybe">     137:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">|</span> <span class="f">(</span><span class="b">word</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="c">16</span> <span class="f">-</span> <span class="b">shift</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="138" /><span class="Maybe">     138:</span> <span class="f">}</span>
<a name="139" /><span class="Maybe">     139:</span> 
<a name="140" /><span class="Maybe">     140:</span> <span class="k">/**</span>
<a name="141" /><span class="Maybe">     141:</span> <span class="k"> * rol8 - rotate an 8-bit value left</span>
<a name="142" /><span class="Maybe">     142:</span> <span class="k"> * @word: value to rotate</span>
<a name="143" /><span class="Maybe">     143:</span> <span class="k"> * @shift: bits to roll</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="k"> */</span>
<a name="145" /><span class="Maybe">     145:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__u8</span> <span class="b">rol8</span><span class="f">(</span><span class="b">__u8</span> <span class="b">word</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="f">{</span>
<a name="147" /><span class="Maybe">     147:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">word</span> <span class="f">&lt;&lt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">|</span> <span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="f">(</span><span class="c">8</span> <span class="f">-</span> <span class="b">shift</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="148" /><span class="Maybe">     148:</span> <span class="f">}</span>
<a name="149" /><span class="Maybe">     149:</span> 
<a name="150" /><span class="Maybe">     150:</span> <span class="k">/**</span>
<a name="151" /><span class="Maybe">     151:</span> <span class="k"> * ror8 - rotate an 8-bit value right</span>
<a name="152" /><span class="Maybe">     152:</span> <span class="k"> * @word: value to rotate</span>
<a name="153" /><span class="Maybe">     153:</span> <span class="k"> * @shift: bits to roll</span>
<a name="154" /><span class="Maybe">     154:</span> <span class="k"> */</span>
<a name="155" /><span class="Maybe">     155:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__u8</span> <span class="b">ror8</span><span class="f">(</span><span class="b">__u8</span> <span class="b">word</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">shift</span><span class="f">)</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="f">{</span>
<a name="157" /><span class="Maybe">     157:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">|</span> <span class="f">(</span><span class="b">word</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="c">8</span> <span class="f">-</span> <span class="b">shift</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="f">}</span>
<a name="159" /><span class="Maybe">     159:</span> 
<a name="160" /><span class="Maybe">     160:</span> <span class="k">/**</span>
<a name="161" /><span class="Maybe">     161:</span> <span class="k"> * sign_extend32 - sign extend a 32-bit value using specified bit as sign-bit</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="k"> * @value: value to sign extend</span>
<a name="163" /><span class="Maybe">     163:</span> <span class="k"> * @index: 0 based bit index (0&lt;=index&lt;32) to sign bit</span>
<a name="164" /><span class="Maybe">     164:</span> <span class="k"> */</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__s32</span> <span class="b">sign_extend32</span><span class="f">(</span><span class="b">__u32</span> <span class="b">value</span><span class="f">,</span> <span class="m">int</span> <span class="b">index</span><span class="f">)</span>
<a name="166" /><span class="Maybe">     166:</span> <span class="f">{</span>
<a name="167" /><span class="Maybe">     167:</span>     <span class="b">__u8</span> <span class="b">shift</span> <span class="f">=</span> <span class="c">31</span> <span class="f">-</span> <span class="b">index</span><span class="f">;</span>
<a name="168" /><span class="Maybe">     168:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">__s32</span><span class="f">)</span><span class="f">(</span><span class="b">value</span> <span class="f">&lt;&lt;</span> <span class="b">shift</span><span class="f">)</span> <span class="f">&gt;&gt;</span> <span class="b">shift</span><span class="f">;</span>
<a name="169" /><span class="Maybe">     169:</span> <span class="f">}</span>
<a name="170" /><span class="Maybe">     170:</span> 
<a name="171" /><span class="Maybe">     171:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="b">fls_long</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">l</span><span class="f">)</span>
<a name="172" /><span class="Maybe">     172:</span> <span class="f">{</span>
<a name="173" /><span class="Maybe">     173:</span>     <span class="m">if</span> <span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="b">l</span><span class="f">)</span> <span class="f">==</span> <span class="c">4</span><span class="f">)</span>
<a name="174" /><span class="Maybe">     174:</span>         <span class="m">return</span> <span class="b">fls</span><span class="f">(</span><span class="b">l</span><span class="f">)</span><span class="f">;</span>
<a name="175" /><span class="Maybe">     175:</span>     <span class="m">return</span> <span class="b">fls64</span><span class="f">(</span><span class="b">l</span><span class="f">)</span><span class="f">;</span>
<a name="176" /><span class="Maybe">     176:</span> <span class="f">}</span>
<a name="177" /><span class="Maybe">     177:</span> 
<a name="178" /><span class="Maybe">     178:</span> <span class="k">/**</span>
<a name="179" /><span class="Maybe">     179:</span> <span class="k"> * __ffs64 - find first set bit in a 64 bit word</span>
<a name="180" /><span class="Maybe">     180:</span> <span class="k"> * @word: The 64 bit word</span>
<a name="181" /><span class="Maybe">     181:</span> <span class="k"> *</span>
<a name="182" /><span class="Maybe">     182:</span> <span class="k"> * On 64 bit arches this is a synomyn for __ffs</span>
<a name="183" /><span class="Maybe">     183:</span> <span class="k"> * The result is not defined if no bits are set, so check that @word</span>
<a name="184" /><span class="Maybe">     184:</span> <span class="k"> * is non-zero before calling this.</span>
<a name="185" /><span class="Maybe">     185:</span> <span class="k"> */</span>
<a name="186" /><span class="Maybe">     186:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">__ffs64</span><span class="f">(</span><span class="b">u64</span> <span class="b">word</span><span class="f">)</span>
<a name="187" /><span class="Maybe">     187:</span> <span class="f">{</span>
<a name="188" /><span class="False">     188:</span> <span class="f">#</span><span class="n">if</span> <a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a> <span class="f">==</span> <span class="c">32</span>
<a name="189" /><span class="False">     189:</span>     <span class="m">if</span> <span class="f">(</span><span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a><span class="f">)</span><span class="b">word</span><span class="f">)</span> <span class="f">==</span> <span class="c">0UL</span><span class="f">)</span>
<a name="190" /><span class="False">     190:</span>         <span class="m">return</span> <span class="b">__ffs</span><span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a><span class="f">)</span><span class="f">(</span><span class="b">word</span> <span class="f">&gt;&gt;</span> <span class="c">32</span><span class="f">)</span><span class="f">)</span> <span class="f">+</span> <span class="c">32</span><span class="f">;</span>
<a name="191" /><span class="False">     191:</span> <span class="f">#</span><span class="n">elif</span> <a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a> <span class="f">!=</span> <span class="c">64</span>
<a name="192" /><span class="False">     192:</span> <span class="f">#</span><span class="n">error</span> <a href="cpu.c_macros_ref.html#_QklUU19QRVJfTE9OR18w"><span class="b">BITS_PER_LONG</span></a> <span class="b">not</span> <span class="c">32</span> <span class="b">or</span> <span class="c">64</span>
<a name="193" /><span class="Maybe">     193:</span> <span class="f">#</span><span class="n">endif</span>
<a name="194" /><span class="Maybe">     194:</span>     <span class="m">return</span> <span class="b">__ffs</span><span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="b">word</span><span class="f">)</span><span class="f">;</span>
<a name="195" /><span class="Maybe">     195:</span> <span class="f">}</span>
<a name="196" /><span class="Maybe">     196:</span> 
<a name="197" /><span class="Maybe">     197:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_X19LRVJORUxfX18w"><span class="b">__KERNEL__</span></a>
<a name="198" /><span class="Maybe">     198:</span> 
<a name="199" /><span class="Maybe">     199:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">find_last_bit</span>
<a name="200" /><span class="Maybe">     200:</span> <span class="k">/**</span>
<a name="201" /><span class="Maybe">     201:</span> <span class="k"> * find_last_bit - find the last set bit in a memory region</span>
<a name="202" /><span class="Maybe">     202:</span> <span class="k"> * @addr: The address to start the search at</span>
<a name="203" /><span class="Maybe">     203:</span> <span class="k"> * @size: The maximum size to search</span>
<a name="204" /><span class="Maybe">     204:</span> <span class="k"> *</span>
<a name="205" /><span class="Maybe">     205:</span> <span class="k"> * Returns the bit number of the first set bit, or size.</span>
<a name="206" /><span class="Maybe">     206:</span> <span class="k"> */</span>
<a name="207" /><span class="Maybe">     207:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">find_last_bit</span><span class="f">(</span><span class="m">const</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">addr</span><span class="f">,</span>
<a name="208" /><span class="Maybe">     208:</span>                    <span class="m">unsigned</span> <span class="m">long</span> <span class="b">size</span><span class="f">)</span><span class="f">;</span>
<a name="209" /><span class="Maybe">     209:</span> <span class="f">#</span><span class="n">endif</span>
<a name="210" /><span class="Maybe">     210:</span> 
<a name="211" /><span class="Maybe">     211:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* __KERNEL__ */</span>
<a name="212" /><span class="True">     212:</span> <span class="f">#</span><span class="n">endif</span>
<a name="213" /><span class="True">     213:</span> </pre>
  </body>
</html>
